package com.heisen.base.utils;

import lombok.SneakyThrows;
import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author sen
 * @description
 * @date 2024/1/9 14:43
 */

public class TimeUtils {
    public final static String  YMDHMS = "yyyyMMddHHmmss";
    public final static String  YMD_HMS = "yyyy-MM-dd HH:mm:ss";

    public final static String  YMD_HM = "yyyy-MM-dd HH:mm";

    public final static String  YMD = "yyyy-MM-dd";
    public static SimpleDateFormat format_ymdhms=new SimpleDateFormat(YMDHMS);

    public static SimpleDateFormat format_ymd_hms=new SimpleDateFormat(YMD_HMS);
    public static SimpleDateFormat format_ymd_hm=new SimpleDateFormat(YMD_HM);
    public static SimpleDateFormat format_ymd=new SimpleDateFormat(YMD);

    public static String getCurrentTime_ymdhms(){
        return format_ymdhms.format(new Date()).toString().trim();
    }

    /**
     * 得到当前时间  yyyy-MM-dd hh:mm:ss
     * @return
     */
    public static String getCurrentTime_ymd_hms(){
        return format_ymd_hms.format(new Date()).toString().trim();
    }

    /**
     * 得到当前时间  yyyy-MM-dd
     * @return
     */
    public static String getCurrentTime_ymd(){
        return format_ymd.format(new Date()).toString().trim();
    }


    /**
     * 现在的时间
     * @return
     */
    public static Date nowDate(){

        return new Date();
    }



    /**
     *@description 得到当前时间的long 格林时间
     *@params
     *@return
     *@author  helei
     *@create_time  2018-10-12
     *@other
     */
    public static long getCurrentTime_long(){
        return new Date().getTime();
    }

    /**
     * 将时间转成指定格式
     */
    public static String to_ymd_hms(Date date){
        String result="";
        try{
            result= format_ymd_hms.format(date);
        }catch(Exception ex){
            return "";
        }
        return result;
    }

    /**
     * 将时间转成指定格式
     */
    public static String to_ymd_hm(Date date){
        String result="";
        try{
            result= format_ymd_hm.format(date);
        }catch(Exception ex){
            return "";
        }
        return result;
    }

    /**
     * 将时间转成指定格式
     */
    public static String to_ymd(Date date){
        String result="";
        try{
            result= format_ymd.format(date);
        }catch(Exception ex){
            return "";
        }
        return result;
    }


    /**
     * 获取截止到指定日期所有周一到周天的日期
     */
    public static Map<String, List<String>> allDateForWeek(Date currentDate, String endDate){
        Calendar calendar =Calendar.getInstance(); //当前日期
        calendar.setTime(currentDate);//设置起始日期，在这个计算中，包含了当天，若想不包含，请在currentDate，传入前，先往后推算一天
        Calendar cend =Calendar.getInstance();
        try {
            cend.setTime(DateUtils.parseDate(endDate,"yyyy-MM-dd"));
            cend.add(Calendar.DAY_OF_MONTH, 1);
        } catch (ParseException e) {
            System.out.println("结束日期-日期转换错误！");
        }
        int currentd=calendar.get(Calendar.DATE);
        calendar.set(Calendar.DATE,currentd-1);

        int currentDayOfWeek=calendar.get(Calendar.DAY_OF_WEEK)-1;
        Map<String,List<String>> map=new HashMap<>();

        for(int i=1;i<8;i++) {
            List<String> dates=new ArrayList<>();
            System.out.println("周"+i);
            Calendar d = (Calendar) calendar.clone();
            if(currentDayOfWeek<i){//如果循环周大于当前的周
                d.add(Calendar.DAY_OF_MONTH, i - currentDayOfWeek);
            }else if(currentDayOfWeek>=i) {
                d.add(Calendar.DAY_OF_MONTH, 7 + i - currentDayOfWeek);
            }
            //向后
            for (; d.before(cend) && d.after(calendar); d.add(Calendar.DAY_OF_YEAR, 7)) {
                dates.add(d.get(Calendar.YEAR)+"-"+handlerNum(1+d.get(Calendar.MONTH))+"-"+handlerNum(d.get(Calendar.DATE)));
            }
            map.put(""+i,dates);
        }
        return map;
    }

    /**
     * 处理数字
     * @return
     */
    private static String handlerNum(int num){
        if(num>9){
            return Integer.toString(num);
        }else{
            return "0"+num;
        }
    }

    /**
     * 获取指定日期是周几
     * @return
     */
    public static String dateForWeek(String date){
        try {
            Date parse = DateUtils.parseDate(date,"yyyy-MM-dd");
            Calendar calendar =Calendar.getInstance(); //当前日期
            calendar.setTime(parse);
            int currentDayOfWeek=calendar.get(Calendar.DAY_OF_WEEK)-1;
            return currentDayOfWeek+"";
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }



    public static double dateDiff(Date startTime, Date endTime) throws Exception {
        //按照传入的格式生成一个simpledateformate对象
        long nd = 1000*24*60*60;//一天的毫秒数
        long nh = 1000*60*60;//一小时的毫秒数
        long nm = 1000*60;//一分钟的毫秒数
        long diff;
        //获得两个时间的毫秒时间差异
        diff = endTime.getTime() - startTime.getTime();
        long day = diff/nd;//计算差多少天
        long hour = diff%nd/nh;//计算差多少小时
        long min = diff%nd%nh/nm;//计算差多少分钟
        return day*24+hour+(min/60d) ;
    }




    /**
     * 获取 时间 格式 （yyyy-MM-dd HH:mm）
     *
     * @param date
     * @return
     */
    @SneakyThrows
    public static Date getDateYYMMDDHHSS(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return  sdf.parse(date);
    }




    /**
     * 获取 时间 格式 （yyyy-MM-dd ）
     *
     * @param date
     * @return
     */
    @SneakyThrows
    public static Date getDateYYMMDD(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return  sdf.parse(date);
    }



    /**
     * 获取 时间 格式 （yyyy-MM-dd ）
     *
     * @param date
     * @return
     */
    @SneakyThrows
    public static Date getDateHHss(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        return  sdf.parse(date);
    }



    /**
     * 计算两个时间相差多少小时 (小于 60分钟 返回0)
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeDifference(Date creatrTime, Date endTime){

        //Date creatrDate = format_ymd_hms.parse(creatrTime);
        long nh = 1000*60*60;//一小时的毫秒数
        //获得两个时间的毫秒时间差异
        long diff = endTime.getTime() - creatrTime.getTime();
        return new Long( diff / nh).intValue();
    }
    /**
     * 计算两个时间相差多少分钟 (小于 60分钟 返回0)
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeMin(Date creatrTime, Date endTime){

        //Date creatrDate = format_ymd_hms.parse(creatrTime);
        long nh = 1000*60;//分钟的毫秒数
        //获得两个时间的毫秒时间差异
        long diff = endTime.getTime() - creatrTime.getTime();
        return new Long( diff / nh).intValue();
    }


    /**
     * 计算两个时间相差多少分钟
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeStrDifference(String creatrTime, Date endTime){

        return  getTimeMin(format_ymd_hm.parse(creatrTime), endTime);
    }

    /**
     * 计算两个时间相差多少分钟
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeStrDifferenceYMD(String creatrTime, Date endTime){

        return  getTimeMin(format_ymd.parse(creatrTime), endTime);
    }




    /**
     * 计算两个时间相差多少 小时
     * @param creatrTime
     * @param endTime
     * @return
     */
    @SneakyThrows
    public static int getTimeStr(String creatrTime, Date endTime){

        return  getTimeDifference(format_ymd_hm.parse(creatrTime), endTime);
    }
}
